#include"httpServer.hpp"
#include<memory>

using namespace server;
using namespace std;

static void usage(std::string proc)
{
    std::cout << "\nUsage:\n\t" << proc << " local_port\n\t\n";
}
std::string suffixToDesc(const std::string& suffix)
{
    std::string ct = "Content-Type: ";
    if(suffix == ".html") ct+= "text/html";
    else if (suffix == ".png") ct+="image/png";
    //为了如果想支持更多后缀可以自己继续加
    ct+= "\r\n";

    return ct;
    
}
void GET(const HttpRequest & req, HttpResponse &resp)
{
    // if(req.path == "/search")
    // {
    //     //这里就执行的是我们自己写的C++search的方法
    //     //使用parm作为参数,而不去执行下面的

    // }
    cout << "---------------http begin-----------------------"<<endl;
    cout << req.inbuffer <<endl;
    std::cout << "method: " << req.method << std::endl;
    std::cout << "url: " << req.url << std::endl;
    std::cout << "httpversion: " << req.httpversion << std::endl;
    std::cout << "path: " << req.path << std::endl;
    std::cout << "suffix: " << req.suffix << std::endl;
    std::cout <<"size: " << req.size << std::endl;
    cout << "---------------http end-----------------------"<<endl;


    // std::string respline ="HTTP/1.1 307 Temporary Redirect\r\n";//就是相当于响应行！
    std::string respline ="HTTP/1.1 200 ok\r\n";//就是相当于响应行！
    std::string respheader = suffixToDesc(req.suffix);

    if(req.size > 0 )
    {
        respheader += "Content_-Length: ";
        respheader += std::to_string(req.size);
        respheader +="\r\n";
    }

    // respheader += "Location: https://www.baidu.com/index.html\r\n";


    std::string respblank = "\r\n"; // 空行
    // std::string body = "<!DOCTYPE html> <html lang=\"en\"> <head> <meta charset=\"UTF-8\"> <title>for test</title> <h1> hello world <h1> </head> <body> <p>10月7日是中秋国庆八天假期过后的首个工作日。这个假期，中秋与国庆相逢，再叠加亚运会热潮，创造了有监测记录以来最高的旅游热度。高速公路车流不息，景区景点人流如潮，街区商圈人气火爆，持续上涨的热情、不断刷新的数据，释放着中国经济的澎湃活力。这个假期，大家究竟是怎么过的？接下来，我们先从出行数据看活力。</p> </body> </html>";

    std::string body;
    body.resize(req.size);
    if(!Util::readfile(req.path,(char*)body.c_str(),body.size()))
    {
        //如果读取失败那么我们应该返回一个网页说是404
        //我们可以在wwwroot下面创建一个404.html这个是一个绝对会存在的文件的！
        Util::readfile(html_404,(char*)body.c_str(),body.size());//这个操作一定能成功！

        
    }

    //如何返回cookie信息？
    respheader += "Set-Cookie: name=12345678bcdefg; Max-Age=60\r\n";//
    //我们后面的串数字以后可以套上认证逻辑，形成session之后将信息保存在session文件里面！然后将session的id直接返回即可！
    //这就是将session信息写入到浏览器中！


    //上面我们都是硬编码！但是实际body的内容是通过文件读取来获得的而是用的路径就是path！
    resp.outbuffer += respline;
    resp.outbuffer += respheader;
    resp.outbuffer +=respblank;
    resp.outbuffer +=body;
}
int main(int argc,char* argv[])
{
    if(argc != 2)
    {
        usage(argv[0]);
        exit(USAGE_ERR);
    }
    uint16_t port = atoi(argv[1]);//将字符串转换为整数


    unique_ptr<httpServer> tsvr(new httpServer(GET));

    //这个就是我们http的功能路由！——通过unordered_map我们可以对不同的路径间设置！调用不同的方法
    // tsvr->RegisterCb("/",GET);
    // tsvr->RegisterCb("/search",Search);
    // tsvr->RegisterCb("/test.py",Other);
    tsvr->initServer();
    tsvr->start();

    return 0;
}
